package com.java.actual.cleanMine;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * 显示所有按钮的面板
 * @author Administrator
 *
 */
public class AllButtonPanel extends JPanel implements ActionListener{
	private int row;//行数
	private int col;//列数
	private int mineCount;//地雷数
	private MineButton[][] allButtons;//所有按钮

	
	public AllButtonPanel(int row,int col,int mineCount){
		this.row=row;
		this.col=col;
		this.mineCount=mineCount;
		allButtons=new MineButton[row][col];
		createButtons();
		
		createMine();
		init();
	}
	
	private void init(){
		this.setLayout(new GridLayout(row,col));
		for(int i=0;i<allButtons.length;i++){
			for(int j=0;j<allButtons[i].length;j++){
				this.add(allButtons[i][j]);
			}
		}
	}
	
	/**
	 * 随机布雷的方法
	 *
	 */
	private void createMine(){
		int n=0;
		while(n<mineCount){//随机生成mineCount个地雷
			int i=(int)(Math.random()*row);
			int j=(int)(Math.random()*col);
			if(allButtons[i][j].getCountOfSurroundMines()!=-1){
				allButtons[i][j].setCountOfSurroundMines(-1);
				n++;
			}
		}
		
		for(int i=0;i<allButtons.length;i++){//计算每个位置的周围地雷数
			for(int j=0;j<allButtons[i].length;j++){
				if(allButtons[i][j].getCountOfSurroundMines()!=-1){
					allButtons[i][j].setCountOfSurroundMines(getSurroundMineCount(i,j));
				}
			}
		}
	}
	
	
	/**
	 * 统计（i，j）坐标周围8个位置的地雷数
	 * @param data
	 * @param i
	 * @param j
	 * @return
	 */
	private int getSurroundMineCount(int i,int j){
		int num=0;//统计周围的雷数
		if(i-1>=0&&j-1>=0){
			num+=(allButtons[i-1][j-1].getCountOfSurroundMines()==-1?1:0);
		}
		if(i-1>=0){
			num+=(allButtons[i-1][j].getCountOfSurroundMines()==-1?1:0);
		}
		if(i-1>=0&&j+1<allButtons[0].length){
			num+=(allButtons[i-1][j+1].getCountOfSurroundMines()==-1?1:0);
		}
		if(j-1>=0){
			num+=(allButtons[i][j-1].getCountOfSurroundMines()==-1?1:0);
		}
		if(j+1<allButtons[0].length){
			num+=(allButtons[i][j+1].getCountOfSurroundMines()==-1?1:0);
		}
		if(i+1<allButtons.length&&j-1>=0){
			num+=(allButtons[i+1][j-1].getCountOfSurroundMines()==-1?1:0);
		}
		if(i+1<allButtons.length){
			num+=(allButtons[i+1][j].getCountOfSurroundMines()==-1?1:0);
		}
		if(i+1<allButtons.length&&j+1<allButtons[0].length){
			num+=(allButtons[i+1][j+1].getCountOfSurroundMines()==-1?1:0);
		}
		return num;	
	}
	
	
	/**
	 * 生成按钮
	 *
	 */
	private void createButtons(){
		for(int i=0;i<allButtons.length;i++){
			for(int j=0;j<allButtons[i].length;j++){
				allButtons[i][j]=new MineButton(i,j);
				allButtons[i][j].setSize(6,6);
				allButtons[i][j].addActionListener(this);//添加点击事件监听
				allButtons[i][j].addMouseListener(new MouseAdapter(){//添加鼠标右键事件监听
					public void mouseClicked(MouseEvent e) {
						if(e.getButton()==MouseEvent.BUTTON3){
							int remain=Integer.parseInt(CleanMine.remainMine.getText());
							JButton b=(JButton)e.getSource();
							if(b.getText().equals("")){
								remain--;
								CleanMine.remainMine.setText(remain+"");
								b.setText("&");
							}else if(b.getText().equals("&")){
								remain++;
								CleanMine.remainMine.setText(remain+"");
								b.setText("");
							}
						}
					}
				});
			}
		}
	}

	
	public void actionPerformed(ActionEvent e) {//点击事件监听的方法
		MineButton b=(MineButton)e.getSource();
		int r=b.getRow();
		int c=b.getCol();
		if(allButtons[r][c].getCountOfSurroundMines()==-1){//如果是地雷
			for(int i=0;i<allButtons.length;i++){//把所有按钮都显示出来
				for(int j=0;j<allButtons[i].length;j++){
					if(allButtons[i][j].getCountOfSurroundMines()==-1){//如果该位置是地雷
						allButtons[i][j].setText("$");
					}else if(allButtons[i][j].getCountOfSurroundMines()==0){//如果该位置为空（该位置不是地雷，周围8个位置也没有地雷）
						allButtons[i][j].setText("");
						allButtons[i][j].setBackground(Color.CYAN);
					}else{//如果该位置不是地雷，但周围8个位置中有地雷
						allButtons[i][j].setText(allButtons[i][j].getCountOfSurroundMines()+"");
						allButtons[i][j].setBackground(Color.CYAN);
					}
				}
			}
		}else{//如果不是地雷
			showEmpty(r,c);//执行排空操作
		}
	}
	
	/**
	 * 排空方法，若（i，j）位置为空，则显示空白。然后依次递归找它周围的8个位置。
	 * @param data
	 * @param i
	 * @param j
	 */
	private void showEmpty(int i,int j){
		MineButton b=allButtons[i][j];
		if(b.isCleared()){
			return;
		}
		if(allButtons[i][j].getCountOfSurroundMines()==0){
			b.setBackground(Color.CYAN);
			b.setCleared(true);
			if(i-1>=0&&j-1>=0){
				showEmpty(i-1,j-1);
			}
			if(i-1>=0){
				showEmpty(i-1,j);
			}
			if(i-1>=0&&j+1<allButtons[0].length){
				showEmpty(i-1,j+1);
			}
			if(j-1>=0){
				showEmpty(i,j-1);
			}
			if(j+1<allButtons[0].length){
				showEmpty(i,j+1);
			}
			if(i+1<allButtons.length&&j-1>=0){
				showEmpty(i+1,j-1);
			}
			if(i+1<allButtons.length){
				showEmpty(i+1,j);
			}
			if(i+1<allButtons.length&&j+1<allButtons[0].length){
				showEmpty(i+1,j+1);
			}
		}else if(allButtons[i][j].getCountOfSurroundMines()>0){
			b.setText(allButtons[i][j].getCountOfSurroundMines()+"");
			b.setBackground(Color.CYAN);
			b.setCleared(true);
		}	
	}
}

